package api

import (
	"TaskAssignmentSystem/internal/admin/dao"
	"TaskAssignmentSystem/internal/admin/services"
	"TaskAssignmentSystem/internal/pkg/middleware/handler"
	"TaskAssignmentSystem/pkg/db/mysql"
	"TaskAssignmentSystem/pkg/utils"
	"fmt"
	"github.com/kataras/iris/v12"
	"gorm.io/gorm"
	"strconv"
)

type DataManageListRequest struct {
	Page          int      `json:"page"`
	PageSize      int      `json:"page_size"`
	DateTimeRange []string `json:"date_time_range"`
}

// @Summary 数据管理列表
// @Description 数据管理列表
// @Tags 数据管理
// @Accept application/json
// @Produce application/json
// @param Accept-Version header string true "1.0.0"
// @param Authorization header string true "验证参数Bearer和token空格拼接"
// @Param param body DataManageListRequest true "数据管理列表参数"
// @Success 200 {object} utils.Response --> 成功后返回数据结构
// @Failure 400 {object} utils.ResponseError --> 失败后返回数据结构
// @Router /admin/data_manage/list [post]
func DataManageListHandler(ctx iris.Context) {
	var RequestParams DataManageListRequest
	if err := ctx.ReadJSON(&RequestParams); err != nil {
		handler.ArgumentErrorHandle(err, ctx)
		return
	}

	var dataManageServe services.DataManageService

	if res, err := dataManageServe.DataList2(RequestParams.Page, RequestParams.PageSize, RequestParams.DateTimeRange); err != nil {
		ctx.JSON(utils.ResponseError{Code: iris.StatusInternalServerError, Message: err.Error()})
		return
	} else {
		for i, s := range res.List {
			if s.AnswerSize/iris.MB < 1 {
				s.AnswerData = fmt.Sprintf("%vKB", strconv.FormatFloat(float64(s.AnswerSize)/iris.KB, 'f', 1, 64))
			} else {
				if s.AnswerSize/iris.MB > 1024 {
					s.AnswerData = fmt.Sprintf("%vGB", strconv.FormatFloat(float64(s.AnswerSize)/iris.GB, 'f', 1, 64))
				} else {
					s.AnswerData = fmt.Sprintf("%vMB", strconv.FormatFloat(float64(s.AnswerSize)/iris.MB, 'f', 1, 64))
				}
			}
			res.List[i] = s
		}
		ctx.JSON(utils.Response{Code: iris.StatusOK, Message: iris.StatusText(iris.StatusOK), Data: res})
		return
	}
}

type DataManageChangedRequest struct {
	ProjectIds []string `json:"project_ids"`
}

// @Summary 批量删除所选项目的通知数据
// @Description 批量删除所选项目的通知
// @Tags 数据管理
// @Accept application/json
// @Produce application/json
// @param Accept-Version header string true "1.0.0"
// @param Authorization header string true "验证参数Bearer和token空格拼接"
// @Param param body DataManageChangedRequest true "批量删除所选项目的通知数据参数"
// @Success 200 {object} utils.Response --> 成功后返回数据结构
// @Failure 400 {object} utils.ResponseError --> 失败后返回数据结构
// @Router /admin/data_manage/message/del [post]
func BatchDeleteProjectMessageHandler(ctx iris.Context) {
	var RequestParams DataManageChangedRequest
	if err := ctx.ReadJSON(&RequestParams); err != nil {
		handler.ArgumentErrorHandle(err, ctx)
		return
	}
	var dataManageServe services.DataManageService
	dataManageServe.ProjectIds = RequestParams.ProjectIds
	if err := dataManageServe.RemoveChangedProjectMessages(); err != nil {
		ctx.JSON(utils.ResponseError{Code: iris.StatusInternalServerError, Message: err.Error()})
		return
	} else {
		ctx.JSON(utils.Response{Code: iris.StatusOK, Message: iris.StatusText(iris.StatusOK), Data: iris.StatusText(iris.StatusOK)})
		return
	}
}

// @Summary 批量删除项目
// @Description 批量删除项目
// @Tags 数据管理
// @Accept application/json
// @Produce application/json
// @param Accept-Version header string true "1.0.0"
// @param Authorization header string true "验证参数Bearer和token空格拼接"
// @Param param body DataManageChangedRequest true "批量删除项目参数"
// @Success 200 {object} utils.Response --> 成功后返回数据结构
// @Failure 400 {object} utils.ResponseError --> 失败后返回数据结构
// @Router /admin/data_manage/project/del [post]
func BatchDeleteProjectHandler(ctx iris.Context) {
	var RequestParams DataManageChangedRequest
	if err := ctx.ReadJSON(&RequestParams); err != nil {
		handler.ArgumentErrorHandle(err, ctx)
		return
	}
	var dataManageServe services.DataManageService
	dataManageServe.ProjectIds = RequestParams.ProjectIds
	if err := dataManageServe.BatchRemoveChangedProjects(); err != nil {
		ctx.JSON(utils.ResponseError{Code: iris.StatusInternalServerError, Message: err.Error()})
		return
	} else {
		ctx.JSON(utils.Response{Code: iris.StatusOK, Message: iris.StatusText(iris.StatusOK), Data: iris.StatusText(iris.StatusOK)})
		return
	}
}

type DataManageDateTimeRangeRequest services.DateTimeRange

// @Summary 批量删除所选时间段发放的题目
// @Description 批量删除所选时间段发放的题目
// @Tags 数据管理
// @Accept application/json
// @Produce application/json
// @param Accept-Version header string true "1.0.0"
// @param Authorization header string true "验证参数Bearer和token空格拼接"
// @Param param body DataManageDateTimeRangeRequest true "批量删除所选时间段发放的题目参数"
// @Success 200 {object} utils.Response --> 成功后返回数据结构
// @Failure 400 {object} utils.ResponseError --> 失败后返回数据结构
// @Router /admin/data_manage/topic/del [post]
func BatchDeleteTopicHandler(ctx iris.Context) {
	var RequestParams DataManageDateTimeRangeRequest
	if err := ctx.ReadJSON(&RequestParams); err != nil {
		handler.ArgumentErrorHandle(err, ctx)
		return
	}
	var dataManageServe services.DataManageService
	dataManageServe.ProjectIds = RequestParams.ProjectIds
	dataManageServe.DateTimeRange.StartDateTime = RequestParams.StartDateTime
	dataManageServe.DateTimeRange.EndDateTime = RequestParams.EndDateTime
	go dataManageServe.RemoveAllTopicForDateTimeRange()
	//if err := dataManageServe.RemoveAllTopicForDateTimeRange(); err != nil {
	//	ctx.JSON(utils.ResponseError{Code: iris.StatusInternalServerError, Message: err.Error()})
	//	return
	//} else {
	ctx.JSON(utils.Response{Code: iris.StatusOK, Message: iris.StatusText(iris.StatusOK), Data: iris.StatusText(iris.StatusOK)})
	return
	//}
}

// @Summary 批量删除所选时间段发放的题目答案
// @Description 批量删除所选时间段发放的题目答案
// @Tags 数据管理
// @Accept application/json
// @Produce application/json
// @param Accept-Version header string true "1.0.0"
// @param Authorization header string true "验证参数Bearer和token空格拼接"
// @Param param body DataManageDateTimeRangeRequest true "批量删除所选时间段发放的题目答案参数"
// @Success 200 {object} utils.Response --> 成功后返回数据结构
// @Failure 400 {object} utils.ResponseError --> 失败后返回数据结构
// @Router /admin/data_manage/topic_answer/del [post]
func BatchDeleteTopicAnswerHandler(ctx iris.Context) {
	var RequestParams DataManageDateTimeRangeRequest
	if err := ctx.ReadJSON(&RequestParams); err != nil {
		handler.ArgumentErrorHandle(err, ctx)
		return
	}
	var dataManageServe services.DataManageService
	dataManageServe.ProjectIds = RequestParams.ProjectIds
	dataManageServe.DateTimeRange.StartDateTime = RequestParams.StartDateTime
	dataManageServe.DateTimeRange.EndDateTime = RequestParams.EndDateTime
	if err := dataManageServe.RemoveAllTopicAnswerForDateTimeRange(); err != nil {
		ctx.JSON(utils.ResponseError{Code: iris.StatusInternalServerError, Message: err.Error()})
		return
	} else {
		ctx.JSON(utils.Response{Code: iris.StatusOK, Message: iris.StatusText(iris.StatusOK), Data: iris.StatusText(iris.StatusOK)})
		return
	}
}

//定时任务执行方法

func DoTask() {
	//删除题目答案
	go func() {
		var dataManageServe services.DataManageService
		dataManageServe.RemoveAllTopicAnswerForDateTimeRange()
	}()
	//删除通知数据
	go func() {
		_db := mysql.GetDB()
		_db.Transaction(func(tx *gorm.DB) error {
			var common dao.Common[dao.SystemMsg]
			common.Tx = tx
			if err := common.RemoveUnscopedWhere(map[string]interface{}{}).Error; err != nil {
				return err
			}
			if err := tx.Model(&dao.UserMessage{}).Unscoped().Delete(&dao.UserMessage{}).Error; err != nil {
				return err
			}
			return nil
		})
	}()
}
